#ifndef _DB_H_
#define _DB_H_
#include <iostream>
#include <string>
#include <mysql/mysql.h>
#include<ctime>
using namespace std;

// mysql_query 执行一条mysql语句
// mysql_query语句在执行select,show等查询语句时，成功返回的是一个资源类型，失败返回的是false
// mysql_query语句在执行insert,update等操作时，成功返回true,失败返回false
class Mysql
{
public:
    // 构造函数
    Mysql()
    {
        _conn = mysql_init(NULL);
    }
    // 析构函数
    ~Mysql()
    {
        // 关闭连接
        if (_conn != nullptr)
        {
            mysql_close(_conn);
        }
    }
    // 连接数据库
    bool connect(string ip, unsigned short port, string user, string password, string dbname)
    {
        MYSQL *p = mysql_real_connect(_conn, ip.c_str(), user.c_str(), password.c_str(), dbname.c_str(), port, nullptr, 0);
        if (p != nullptr)
        {
            // 设置编码方式
            // C/C++代码默认的编码字符是ASCII，如果不设置，从MYSQL上拉下来的中文显示?
            mysql_query(_conn, "set names gbk");
            return true;
        }
        else
        {
            printf("err:%s\n", mysql_error(_conn));
        }
        return false;
    }

    // 更新数据库
    bool update(string sql)
    {
        if (mysql_query(_conn, sql.c_str()))
        {
            printf("err:%s\n", mysql_error(_conn));
            cout << __FILE__ << ":" << __LINE__ << ":"
                 << sql << "更新失败!";
            return false;
        }
        return true;
    }

    // 查询操作
    MYSQL_RES *query(string sql)
    {
        if (mysql_query(_conn, sql.c_str()))
        {
            cout << __FILE__ << ":" << __LINE__ << ":"
                 << sql << "查询失败!";
            return nullptr;
        }
        return mysql_use_result(_conn);
    }

    // 获取连接
    MYSQL *getConnection()
    {
        return _conn;
    }

    //刷新时间
    void refreshalivetime()
    {
        _alivetime=clock();
    }
    //返回存活的时间
    clock_t getalivetime()
    {
        return clock()-_alivetime;
    }
private:
    MYSQL *_conn;
    clock_t _alivetime; //记录进入空闲队列后的时间
};
#endif